# Google Test库的配置

# 库版本
set(GTEST_VERSION "1.16.0")

# 设置GTest库目录
set(GTEST_INCLUDE_DIR "${DEP_PLATFORM_DIR}/gtest/include")

# 除了Windows,其他平台只有Releas，所以不区分
if(WIN32)
    # 确定Debug/Release目录
    if(CMAKE_BUILD_TYPE STREQUAL "Debug")
        set(GTEST_LIB_DIR "${DEP_PLATFORM_DIR}/gtest/lib/Debug")
    else()
        set(GTEST_LIB_DIR "${DEP_PLATFORM_DIR}/gtest/lib/Release")
    endif()
else()
    set(GTEST_LIB_DIR "${DEP_PLATFORM_DIR}/gtest/lib")
endif()
# 如果库目录不存在，则使用主目录
if(NOT EXISTS "${GTEST_LIB_DIR}")
    set(GTEST_LIB_DIR "${DEP_PLATFORM_DIR}/gtest/lib")
endif()

# 设置库文件名称（根据平台不同而异）
if(WIN32)
    set(GTEST_LIBRARIES 
        "${GTEST_LIB_DIR}/gtest.lib"
        "${GTEST_LIB_DIR}/gtest_main.lib"
        "${GTEST_LIB_DIR}/gmock.lib"
        "${GTEST_LIB_DIR}/gmock_main.lib"
    )
    
    # 添加DLL文件（如果是动态链接）
    set(GTEST_DLL_FILES 
        "${GTEST_LIB_DIR}/gtest.dll"
        "${GTEST_LIB_DIR}/gtest_main.dll"
        "${GTEST_LIB_DIR}/gmock.dll"
        "${GTEST_LIB_DIR}/gmock_main.dll"
    )
    
    # 复制DLL文件到输出目录（如果存在）
    foreach(DLL_FILE ${GTEST_DLL_FILES})
        if(EXISTS "${DLL_FILE}")
            message(STATUS "复制GTest DLL文件: ${DLL_FILE} -> ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
            file(COPY "${DLL_FILE}" DESTINATION "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
        else()
            message(STATUS "GTest DLL文件不存在: ${DLL_FILE}")
        endif()
    endforeach()
    
    # 也复制到测试输出目录
    if(DEFINED CMAKE_BINARY_DIR)
        set(TEST_OUTPUT_DIR "${CMAKE_BINARY_DIR}/bin/tests")
        foreach(DLL_FILE ${GTEST_DLL_FILES})
            if(EXISTS "${DLL_FILE}")
                message(STATUS "复制GTest DLL文件到测试目录: ${DLL_FILE} -> ${TEST_OUTPUT_DIR}")
                file(COPY "${DLL_FILE}" DESTINATION "${TEST_OUTPUT_DIR}")
            endif()
        endforeach()
    endif()
else()
    set(GTEST_LIBRARIES 
        "${GTEST_LIB_DIR}/libgtest.a"
        "${GTEST_LIB_DIR}/libgtest_main.a"
        "${GTEST_LIB_DIR}/libgmock.a"
        "${GTEST_LIB_DIR}/libgmock_main.a"
    )
endif()

# 检查是否使用GTest框架
option(USE_GTEST "使用Google Test框架" ON)

# 如果不使用GTest，则跳过后续配置
if(NOT USE_GTEST)
    return()
endif()

# 检查库是否存在
set(GTEST_FOUND FALSE)
if(EXISTS "${GTEST_INCLUDE_DIR}/gtest.h")
    set(GTEST_FOUND TRUE)
    message(STATUS "找到GTest头文件: ${GTEST_INCLUDE_DIR}/gtest.h")
elseif(EXISTS "${GTEST_INCLUDE_DIR}/gtest/gtest.h")
    set(GTEST_FOUND TRUE)
    message(STATUS "找到GTest头文件: ${GTEST_INCLUDE_DIR}/gtest/gtest.h")
else()
    message(STATUS "未找到GTest头文件")
endif()

# 检查库文件
if(GTEST_FOUND)
    message(STATUS "开始检查GTest库文件...")
    message(STATUS "预期库目录: ${GTEST_LIB_DIR}")
    foreach(LIB_FILE ${GTEST_LIBRARIES})
        message(STATUS "检查库文件: ${LIB_FILE}")
        if(NOT EXISTS "${LIB_FILE}")
            message(STATUS "GTest库文件不存在: ${LIB_FILE}")
            # 尝试list目录内容进行调试
            get_filename_component(LIB_DIR "${LIB_FILE}" DIRECTORY)
            if(EXISTS "${LIB_DIR}")
                file(GLOB LIB_DIR_CONTENTS "${LIB_DIR}/*")
                message(STATUS "目录 ${LIB_DIR} 的内容: ${LIB_DIR_CONTENTS}")
            else()
                message(STATUS "目录不存在: ${LIB_DIR}")
            endif()
            set(GTEST_FOUND FALSE)
        else()
            message(STATUS "找到库文件: ${LIB_FILE}")
        endif()
    endforeach()
    
    if(GTEST_FOUND)
        message(STATUS "成功找到所有GTest库文件")
    endif()
endif()

# 如果未找到GTest库，则尝试从源码构建
if(NOT GTEST_FOUND)
    message(STATUS "未找到预编译的GTest库，尝试从源码构建...")
    
    # 确认是否要从源码构建
    option(USE_GTEST_SOURCE "从源码构建GTest" ON)
    
    if(USE_GTEST_SOURCE)
        include(FetchContent)
        FetchContent_Declare(
            googletest
            GIT_REPOSITORY https://github.com/google/googletest.git
            GIT_TAG v${GTEST_VERSION}
        )
        
        # 配置GTest构建选项
        set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
        set(BUILD_GMOCK ON CACHE BOOL "" FORCE)
        set(INSTALL_GTEST OFF CACHE BOOL "" FORCE)
        
        FetchContent_MakeAvailable(googletest)
        
        # 使用自动下载构建的GTest
        set(GTEST_LIBRARIES gtest gtest_main gmock gmock_main)
        set(GTEST_FOUND TRUE)
        message(STATUS "已从源码构建GTest库")
    else()
        message(STATUS "跳过GTest配置，测试中的GTest功能将被禁用")
    endif()
endif()

# 导出变量
set(GTEST_INCLUDE_DIR ${GTEST_INCLUDE_DIR} PARENT_SCOPE)
set(GTEST_LIBRARIES ${GTEST_LIBRARIES} PARENT_SCOPE)
set(GTEST_FOUND ${GTEST_FOUND} PARENT_SCOPE)
set(USE_GTEST ${USE_GTEST} PARENT_SCOPE) 